package com.china.cnlongdb.basic.entity.query;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;

import com.china.cnlongdb.basic.enums.where.LongDbWhereType;

/**
 * 系统名称：LongDbWhere.java
 * 模块名称：
 * 模块描述：longdb - 查询构造器
 * 功能列表：
 * 模块作者：ZOUYONG
 * 开发时间：2018年12月5日 下午9:56:20
 * 模块路径：com.china.cnlongdb.basic.entity.query.LongDbWhere
 * 更新记录：
 */
public class LongDbWhere {

	// 要查询的字段名称
	private String whereKey;
	
	// 关联查询的字段
	private String joinKey;
	
	// 要查询的类型
	private String type;
	
	// 要查询的开始字段值
	private Object startValue;
	
	// 要查询的结束字段值
	private Object endValue;
	
	// or查询需要的查询对象列表
	private List<LongDbWhere> orWheres = new ArrayList<LongDbWhere>();
	
	// 是否关联查询的属性
	private boolean isJoin = false;
	
	// 是否是表分区查询的属性
	private boolean tableMatching = false;
	
	// 要查询对象的数据类型
	private Class cls;
	
	public LongDbWhere() {}
	
	public LongDbWhere(String whereKey) {
		this.whereKey = whereKey;
		this.joinKey = whereKey;
	}
	
	public LongDbWhere(String whereKey, String joinKey) {
		this.whereKey = whereKey;
		this.joinKey = joinKey;
	}

	/**
	 * 功能描述：定义查询对象
	 * 模块作者：ZOUYONG
	 * 开发时间：2018年11月10日 下午1:29:20
	 * 更新记录：
	 * 返回数据：LongDbWhere
	 */
	public static LongDbWhere where(String whereKey) {
		return new LongDbWhere(whereKey);
	}
	
	/**
	 * 功能描述：定义要关联查询的对象
	 * 模块作者：ZOUYONG
	 * 开发时间：2018年12月1日 上午11:27:59
	 * 更新记录：
	 * 返回数据：LongDbWhere
	 */
	public static LongDbWhere where(String whereKey, String joinKey) {
		return new LongDbWhere(whereKey, joinKey);
	}

	/**
	 * 功能描述：相等查询
	 * 模块作者：ZOUYONG
	 * 开发时间：2018年11月10日 下午1:31:30
	 * 更新记录：
	 * 返回数据：LongDbWhere
	 */
	public LongDbWhere is(Object value) {
		this.startValue = value;
		this.type = LongDbWhereType.is.name();
		return this;
	}

	/**
	 * 功能描述：相等查询
	 * 模块作者：ZOUYONG
	 * 开发时间：2018年12月1日 上午11:30:45
	 * 更新记录：
	 * 返回数据：LongDbWhere
	 */
	public LongDbWhere eq() {
		this.type = LongDbWhereType.eq.name();
		this.isJoin = true;
		return this;
	}
	
	/**
	 * 功能描述：in查询
	 * 模块作者：ZOUYONG
	 * 开发时间：2018年11月10日 下午5:31:17
	 * 更新记录：
	 * 返回数据：LongDbWhere
	 */
	public LongDbWhere in(Collection<?> object) {
		List<Object> startList = new ArrayList<Object>();
		if(null == this.startValue) {
			this.startValue = startList;
		} else {
			startList.addAll((List)this.startValue);
		}
		startList.addAll(object);
		this.startValue = startList;
		this.type = LongDbWhereType.in.name();
		return this;
	}

	/**
	 * 功能描述：in查询
	 * 模块作者：ZOUYONG
	 * 开发时间：2018年11月10日 下午5:32:08
	 * 更新记录：
	 * 返回数据：LongDbWhere
	 */
	public LongDbWhere in(Object... object) {
		List<Object> startList = new ArrayList<Object>();
		if(null == this.startValue) {
			this.startValue = startList;
		} else {
			startList.addAll((List)this.startValue);
		}
		startList.addAll(Arrays.asList(object));
		this.startValue = startList;
		this.type = LongDbWhereType.in.name();
		return this;
	}

	/**
	 * 功能描述：区间查询
	 * 模块作者：ZOUYONG
	 * 开发时间：2018年11月30日 下午11:25:28
	 * 更新记录：
	 * 返回数据：LongDbWhere
	 */
	public LongDbWhere between(Object startObject, Object endObject, Class cls) {
		this.startValue = startObject;
		this.endValue = endObject;
		this.type = LongDbWhereType.between.name();
		this.cls = cls;
		return this;
	}

	/**
	 * 功能描述：like模糊查询
	 * 模块作者：ZOUYONG
	 * 开发时间：2018年11月10日 下午5:47:14
	 * 更新记录：
	 * 返回数据：LongDbWhere
	 */
	public LongDbWhere like(Object object) {
		this.startValue = object;
		this.type = LongDbWhereType.like.name();
		return this;
	}
	
	/**
	 * 功能描述：大于查询
	 * 模块作者：ZOUYONG
	 * 开发时间：2018年11月10日 下午6:07:28
	 * 更新记录：
	 * 返回数据：LongDbWhere
	 */
	public LongDbWhere large(Object object) {
		this.startValue = object;
		this.type = LongDbWhereType.large.name();
		return this;
	}

	/**
	 * 功能描述：大于等于查询
	 * 模块作者：ZOUYONG
	 * 开发时间：2018年11月10日 下午7:04:12
	 * 更新记录：
	 * 返回数据：LongDbWhere
	 */
	public LongDbWhere largeq(Object object) {
		this.startValue = object;
		this.type = LongDbWhereType.largeq.name();
		return this;
	}

	/**
	 * 功能描述：小于查询
	 * 模块作者：ZOUYONG
	 * 开发时间：2018年11月10日 下午6:08:43
	 * 更新记录：
	 * 返回数据：LongDbWhere
	 */
	public LongDbWhere small(Object object) {
		this.startValue = object;
		this.type = LongDbWhereType.small.name();
		return this;
	}

	/**
	 * 功能描述：小于等于查询
	 * 模块作者：ZOUYONG
	 * 开发时间：2018年11月10日 下午7:04:33
	 * 更新记录：
	 * 返回数据：LongDbWhere
	 */
	public LongDbWhere smallq(Object object) {
		this.startValue = object;
		this.type = LongDbWhereType.smallq.name();
		return this;
	}
	
	/**
	 * 功能描述：or查询
	 * 模块作者：ZOUYONG
	 * 开发时间：2018年11月10日 下午11:01:27
	 * 更新记录：
	 * 返回数据：LongDbWhere
	 */
	public LongDbWhere or(LongDbWhere... dbWhere) {
		orWheres.addAll(Arrays.asList(dbWhere));
		return this;
	}
	
	/**
	 * 功能描述：设置是否区间查询
	 × 模块作者：ZOUYONG
	 × 开发时间：2018年12月24日 上午10:20:34
	 × 返回数据：LongDbWhere
	 */
	public LongDbWhere tableMatching(boolean tableMatching) {
		this.tableMatching = tableMatching;
		return this;
	}

	public String getWhereKey() {
		return whereKey;
	}

	public void setWhereKey(String whereKey) {
		this.whereKey = whereKey;
	}

	public Object getStartValue() {
		return startValue;
	}

	public void setStartValue(Object startValue) {
		this.startValue = startValue;
	}

	public String getType() {
		return type;
	}

	public void setType(String type) {
		this.type = type;
	}

	public List<LongDbWhere> getOrWheres() {
		return orWheres;
	}

	public void setOrWheres(List<LongDbWhere> orWheres) {
		this.orWheres = orWheres;
	}

	public Object getEndValue() {
		return endValue;
	}

	public void setEndValue(Object endValue) {
		this.endValue = endValue;
	}

	public String getJoinKey() {
		return joinKey;
	}

	public void setJoinKey(String joinKey) {
		this.joinKey = joinKey;
	}

	public boolean isJoin() {
		return isJoin;
	}

	public void setJoin(boolean isJoin) {
		this.isJoin = isJoin;
	}

	public boolean isTableMatching() {
		return tableMatching;
	}

	public void setTableMatching(boolean tableMatching) {
		this.tableMatching = tableMatching;
	}

	public Class getCls() {
		return cls;
	}

	public void setCls(Class cls) {
		this.cls = cls;
	}
	
}
